<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title>Sucha's Blog - Archive for August, 2025</title>
    <meta name="generator" content="MarkdownProjectCompositor.lua">
    <meta name="author" content="Sucha">
    <meta name="keywords" content="suchang, programming, Linux, Lua">
    <meta name="description" content="Sucha's blog">
    <link rel="shortcut icon" href="../images/ico.png">
    <link rel="stylesheet" type="text/css" href="../styles/blog.css">
    <link rel="stylesheet" type="text/css" href="../styles/prism.min.css">
    <style id="site_theme"></style>
  </head>
  <body>
    <div id="body">
      <div id="text">
	   <!-- Page published by cmark-gfm begins here --><h1>Sucha's Blog ~ Archive for August, 2025</h1>
<p><a id="p2"></a></p>
<div class="date">25年8月30日 周六 21:56</div>
<h2>iOS GCD （Grand Central Dispatch）的一些探索</h2>
<p>面试遇到了相关问题，答得很烂，才发现自己之前只是粗浅地使用，并未理解。</p>
<p>代码是类似这样的</p>
<pre><code class="language-objc">- (void)exampleFunction {
    dispatch_queue_t queue = dispatch_queue_create(@&quot;test_queue&quot;, NULL);
    NSLog(@&quot;1&quot;);
    dispatch_queue_async(queue, ^{
        NSLog(@&quot;2&quot;);
    });
    NSLog(@&quot;3&quot;);
    dispatch_queue_sync(queue, ^{
        NSLog(@&quot;4&quot;);
    });
    NSLog(@&quot;5&quot;);
}
</code></pre>
<p>那么其输出顺序将是：</p>
<pre><code class="language-bash">1
3
2
4
5
</code></pre>
<p>更进一步，dispatch_queue_create 如果不指定绑定的 queue，那么其运行就是当前发起 queue 的空间。</p>
<p>看了一下 GCD 的源码，不甚懂，太多条件编译了，以及宏代码。</p>
<p>问了一下 AI，pthread、NSThread、GCD、NSOperationQueue 的区别，大概如下</p>
<ul>
<li>pthread 是 POSIX 标准定义的，操作系统调度的最小单元，线程的 C/C++ 接口</li>
<li>NSThread 是 pthread 的 ObjC 的封装，方便使用</li>
<li>GCD 管理的是可运行的闭包 block，具体实际运行在哪个 thread、CPU 核上，是由 GCD 库调度的</li>
<li>NSOpeationQueue 直观了闭包的运行、suspend、resume、cancel，底层实际上是 GCD 的 dispatch_queue</li>
</ul>
<p>在 iOS 上用的最多的是 GCD，GCD 创建的时候，可以设定是串行、并行，优先级等，但不能指定其底层 thread，或者关联到自己创建的 NSThread 上。</p>
<p>若提交的任务闭包是一个死循环，那么运行该闭包的 dispatch_queue 会卡住，关联的 thread 会吃满能够分配到的 CPU 资源，才被调度出去。</p>
<ul>
<li>闭包是一个个被调用的函数，如果是串行的 queue，提交的闭包不会被同时调度运行</li>
<li>如果同一个串行 queue 的任务闭包，再次 sync 了新的 block，将会造成死锁</li>
<li>提交到 sync 的闭包，相当于运行了一个引用了数据资源的任务块，与直接运行该闭包函数，感觉没啥不同，只是在调度上，由于串行 queue 的闭包是顺序执行的，那么在该 sync 的闭包之前提交的所有 async 闭包，都会被先调度运行，才会轮到该 sync 闭包调度运行</li>
<li>提交到该 queue 的闭包，运行的线程空间，是其优先级指定的线程，比如创建了 background queue，在主线程 sync 了该 queue 的闭包，主线程堆栈会被保存，GCD 将调度到 queue 关联的线程运行完闭包后，才会回到主线程恢复堆栈继续</li>
</ul>
<p>以上串行 queue 的调度逻辑，体现在上面例子代码“2”、“4”的输出顺序上，async、sync 闭包运行的 queue 空间，也是该 queue 创建时候的空间（有另外的 create 接口，提供关联的管理queue，比如不同层级的优先级queue）。</p>
<p>但如果是并行 queue，提交的任务闭包，就有可能被同时调度运行，具体跟该体系的 CPU 核心数量、线程调度资源有关系，但被重入是无法避免的。为了保证数据的一致性，提交到并行 queue 的任务闭包，得自己保证数据一致性。</p>
<p>NSOperationQueue 由于底层仍然是关联的 GCD dispatch_queue，所以逻辑是一样的。</p>
<p>以上，可以看到 GCD 是关注闭包，即逻辑关联的数据，而不需要关注线程空间的创建、销毁、挂起、恢复、CPU 的调度和分配逻辑。</p>
<p>GCD 内建了比如主队列（UI相关）、默认队列、后台队列等等共 5 种 QOS 分配策略的队列。</p>
<p>如果是自己创建的 pthread、NSThread 得通过相关接口，才能设置线程的优先级，但另一方面，如果有些业务逻辑包含其依赖的数据，在一个死循环里面更好处理，那不如就直接用 NSThread，或许比 GCD 的分配更好吧。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2025-08.html#p2">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<p><a id="p1"></a></p>
<div class="date">25年8月30日 周六 21:56</div>
<h2>交管12123——学法减分</h2>
<p>之前老家的车被我开到了深圳，住的离东莞很近，就经常到东莞的超市买东西，反正车一周总要热一次，补电瓶的电的。</p>
<p>经常是下班回来后过去，都 20:30 之后了，那次是看到了红灯，但没管那么多，跟着人家粤S的车后面右转，这回是记 6 分，200 块。</p>
<p>好在 交管12123 app 上，可以学法减分，上面会红点提示，但是如果一次被扣 12 分，就得妥妥的重新考试拿驾照了吧，还有，一年内考试最多可以补 6 分，所以，一年内是有 18 分可以扣的？</p>
<p>所谓的学法减分，首先你得被扣分了，然后才能看减分入口，有网上学习，以及线下公益活动可选。这么热的天，还是学法减分好，首先得申请，通过之后才能看警示视频，之后是考试，20 道题错题少于3道才能过，只能补考一次，时间限制没那么严。</p>
<p>看警示视频每次至少 30 分钟，间隔 5 分钟上报时间，中间有人脸识别流程，时间到了会提示，可以进入下一个环节，进行考试了。</p>
<p>我裸考发现很难考，还是得多学习才能考试通过的。</p>
<div class="category"><a href="CategoryLife.html">CategoryLife</a> / <a href="2025-08.html#p1">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<p><a id="p0"></a></p>
<div class="date">25年8月30日 周六 21:36</div>
<h2>凡人修仙传（3）</h2>
<p>电子书凡人修仙传我已经看到慕兰人从对抗到联合了，但只可惜动画进度很慢，才到了慕沛灵自爆贴身侍女这里，韩立从闭关中出来。</p>
<p>谁想到，电视剧都有了，不过我没有会员，都是从夸克下载的，也是断断续续地下载，不是 4k 的不看，要不 27 寸屏幕看着就太粗糙了，蓝瘦。</p>
<p>电视剧的人物南宫婉的嘴是歪的，有仙女之气，但金晨来演，有点太冷了，我先看的是动画，原著里面没有那么多吃醋的场景，动画最多，哈哈哈，电视剧里面人物太冷了，从动画过来的，有点不习惯。</p>
<p>其实看过原著就知道，电视剧很多是借鉴动画的。</p>
<p>比如韩立的师傅李化元，原著里面对于其陨落，是在慕兰人入侵之后，当时韩立已经是落云宗长老了，见到了黄枫谷的弟子们，才知道的；动画里面，李还因为红佛跟云露老祖对抗，戏份还是很多的；电视剧因为篇幅问题吧，这段比较少。</p>
<p>电视剧篇幅的原因，只有 30 集，以韩立从古传送阵离开天南为结束；结束时，也跟动画剧情一样，被王婵追杀，最后王婵看着韩立从古传送阵离开。</p>
<p>电视剧的动画效果，跟动画版比起来，大部分是不如的，不过也有出彩的部分，毕竟真人演，如果有不习惯动画的，真人可以过渡一下。</p>
<p>另外，从凡人的篇幅看，真人版应该也会拍外海的吧，然后看情况也会有其他篇的。</p>
<p>总的来说，还行吧，能看，但看过动画的，就没必要看电视剧了，动画才是最雕的。</p>
<div class="category"><a href="CategoryReading.html">CategoryReading</a> / <a href="2025-08.html#p0">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- Page published by cmark-gfm ends here -->
  <div id="foot">2004-<script>var d = new
	Date();document.write(d.getFullYear())</script> &copy;
	Sucha. Powered by MarkdownProjectCompositor.
  </div>
  </div><!-- text -->
  <div id="sidebar">
  </div><!-- sidebar -->
  <script src="../js/prism.min.js" async="async"></script>
  <script src="../js/blog_sidebar.js"></script>
  </div> <!-- body -->
</body>
</html>